﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

class PersonNew
{
public:
	PersonNew()
	{
		cout << "默认构造调用！" << endl;
	}
	PersonNew(int a)
	{
		cout << "有参构造调用！" << endl;
	}
	~PersonNew()
	{
		cout << "析构函数调用！" << endl;
	}
};
void testNew()
{
	//1.栈区开辟，会释放内存，调用析构；
	//PersonNew p1;

	//2.所有new出来的对象，都会返回该类型的指针；malloc返回void*类型指针，还要强转；
		//malloc不会调用构造，new会调用构造；
		//new是运算符，malloc是函数；
	PersonNew* p2 = new PersonNew;//默认构造调用！

	//3.释放堆区空间，调用析构；delete也是运算符，配合new使用；malloc配合free使用；
	delete p2;//析构函数调用！

	//void* p3 = new PersonNew;
	//void* p3 = new PersonNew(20);
	//4.当使用void*接收new出来的指针时，会出现释放问题；无法释放p3，所以要避免这样的写法；
	//delete p3;

	//5.通过new开辟数组，一定会调用默认构造函数，故必须提供默认构造；此时调用了10次默认构造；
	PersonNew* pArray = new PersonNew[10];//默认构造调用！ 默认构造调用！ ...  默认构造调用！

	//7.释放数组；delete []
	delete[] pArray;//析构函数调用！ 析构函数调用！  ...  析构函数调用！


	//6.在栈上开辟数组，可以只调有参构造；
	PersonNew pArray2[2] = { PersonNew(30),PersonNew(40) };//有参构造调用！有参构造调用！析构函数调用！析构函数调用！
}

//main265：new运算符的使用
int main265()
{
	testNew();

	system("pause");
	return EXIT_SUCCESS;
}